package db

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"log"
	"strconv"
	"time"
)

type Settings struct {
	Url         string `yaml:"url"`
	MaxIdleConn string `yaml:"max-idle-conn"` // 最大閒置連接數
	MaxOpenConn string `yaml:"max-open-conn"` // 最大同時連接數
	MaxLifetime string `yaml:"max-lifetime"`  // connection的最大存活時間（秒）
	MaxIdleTime string `yaml:"max-idle-time"` // connection的最大閒置時間（秒）
}

var GormDB *gorm.DB

func Init(s Settings) {
	// 自定义日志配置
	newLogger := logger.New(
		log.New(log.Writer(), "", log.LstdFlags), // io writer
		logger.Config{
			SlowThreshold:             time.Second, // 慢 SQL 阈值
			LogLevel:                  logger.Info, // 日志级别
			IgnoreRecordNotFoundError: true,        // 忽略记录未找到错误
			Colorful:                  true,        // 彩色打印
		},
	)
	// 打开数据库连接
	var err error
	GormDB, err = gorm.Open(mysql.Open(s.Url), &gorm.Config{
		Logger: newLogger,
	})
	if err != nil {
		panic("failed to connect database: " + err.Error())
	}
	// 获取通用数据库对象 sql.DB，然后设置连接池参数
	sqlDB, err := GormDB.DB()
	if err != nil {
		panic("failed to get sql.DB: " + err.Error())
	}
	// SetMaxIdleConns 设置空闲连接池中连接的最大数量
	if s.MaxIdleConn != "" {
		if maxIdleConn, e := strconv.Atoi(s.MaxIdleConn); e != nil {
			panic("failed to convert MaxIdleConn to int: " + e.Error())
		} else {
			sqlDB.SetMaxIdleConns(maxIdleConn)
		}
	}
	// SetMaxOpenConns 设置打开数据库连接的最大数量
	if s.MaxOpenConn != "" {
		if maxOpenConn, e := strconv.Atoi(s.MaxOpenConn); e != nil {
			panic("failed to convert MaxOpenConn to int: " + e.Error())
		} else {
			sqlDB.SetMaxOpenConns(maxOpenConn)
		}
	}
}
